package cn.kgc.springday08.service.impl;

import cn.kgc.springday08.entity.User;
import cn.kgc.springday08.mapper.UserMapper;
import cn.kgc.springday08.service.UserRoleService;
import cn.kgc.springday08.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author: 课工场
 * @Version: v1.0  2023/6/20
 * @Description:
 *  @Transactional   事务注解
 *  位置：
 *    ElementType.TYPE,    类        对类中所有重写的方法有效
 *    ElementType.METHOD  方法    只对当前方法控制事务
 *  常见的注解属性：
 *      Propagation propagation     事务的传播特性  七种   默认  REQUIRED
 *                                 含有事务的 A方法  调用了含有事务的 B方法
 *     Isolation isolation        事务的隔离级别     四种
 *
 *          READ_UNCOMMITTED      读未提交     A事务  3  insert            B事务  3  select   4       脏读  不可重复度  幻读
 *   oracle READ_COMMITTED        读已提交     A事务  3  insert            B事务  3  select  3 -> 4         不可重复度  幻读
 *   mysql  REPEATABLE_READ      可重复读     A事务  3  insert            B事务  3  select  3       幻读
 *          SERIALIZABLE          串行化       A事务  3  insert            B事务  select
 *
 *    事务的特点：
 *        1.原子性   业务的最少执行单元 不可在分割
 *        2.一致性   业务执行过程中  多条DML语句 要么同时成功 要么同时失败  保持数据库中数据的总量不变
 *        3.隔离性  事务之间相互独立
 *        4.持久性  数据的持久化 将数据写入数据库
 *    SQL语句的分类：
 *          DDL  数据定义语言  创建库表 语句   修改库表语句  (create alter  )
 *          DML  数据操作语言   update  insert  delete
 *          DQl  数据查询语句   select
 *          DCL  数据控制语言    rollback  commit
 *
 *   rollbackFor   指定回滚的异常类型
 *   noRollbackFor   指定不回滚的异常类型
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;


    @Autowired
    private UserRoleService userRoleService;


    @Override
    public List<User> getList() {
        List<User> list = userMapper.getList();
        return list;
    }

    @Override
    @Transactional
    public Integer deleteById(Integer id) {

        // 根据用户id  从user表中删除用户信息
        Integer line1 = userMapper.deleteById(id);

        // 根据用户id 删除user_role表中的数据
        Integer line2 = userRoleService.deleteByUId(id);

        return line1+line2;

    }


    public Integer deleteById2(Integer id) {
        Integer line = userMapper.deleteById(id);
        String str = null;
        str.toString();
        return line;

    }
}
